package com.bokey.controller;

import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bokey.entity.User;
import com.bokey.service.Impl.SendEmailService;
import com.bokey.service.UserService;
import com.bokey.utils.R;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Random;

@CrossOrigin // 跨域解决
@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;

    // 用户注册
    @PostMapping("/insert")
    public Boolean insertUser(@RequestBody User user){
        // System.out.println("收到注册的参数：用户名"+ user.getUsername() + "，密码：" + user.getPassword() + "，邮箱：" + user.getMail() + "，性别：" + user.getSex());
        // 邮箱查重，看数据库里是否有该邮箱的注册信息
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("mail",user.getMail());
        if (userService.getOne(userQueryWrapper) != null){
            return false;
        }
        return userService.save(user);
    }

    // 发送邮箱验证码
    @Resource
    private TemplateEngine templateEngine; // 发送模板页面需要
    @Autowired
    private SendEmailService sendEmailService;
    // 生成随机数函数 参数n是随机数的位数
    public static String creatCode(int n) {
        //3、定义一个字符串变量记录生成的随机字符
        String code = "";
        Random r = new Random();
        //2、定义一个for循环，循环n次，依次生成随机字符
        for (int i = 0; i < n; i++) {
            //i=0 1 2
            //3、生成一个随机字符，英文大、小写 数字（0 1 2 ）
            int type = r.nextInt(3);//0 1 2
            switch (type) {
                case 0:
                    //大写字符（A 65-Z 65+25）
                    char ch = (char) (r.nextInt(26) + 65);
                    code += ch;
                    break;
                case 1:
                    //小写字符（a 97-z 97+25）
                    char ch1 = (char) (r.nextInt(26) + 97);
                    code += ch1;
                    break;
                case 2:
                    //数字字符
                    code += r.nextInt(10);//0-9
                    break;
            }
        }
        return code;
    }
    // 发送邮件，注册验证码
    @PostMapping("/emailCheck")
    public String sendEmailCheck(@RequestBody User user){
        System.out.println("发送邮件给：" + user.getMail());
        String to = user.getMail(); // 用户的邮箱
        String subject = "【邮箱验证码】"; // 模板邮件标题
        // 使用模板邮件定制邮件正文内容
        Context context = new Context(); // 这里的Context类是Thymeleaf的类：org.thymeleaf.context.Context
        context.setVariable("username",user.getUsername()); // 设置传入模板页面的thymeleaf参数username，模拟用户名Bokey
        String code = creatCode(5); // 生成五位数的随机数
        context.setVariable("code",code); // 设置传入模板页面的thymeleaf参数code，模拟验证码456123
        // 使用TemplateEngine设置要处理的模板页面，将context中的参数传入模板页面
        String emailContent = templateEngine.process("emailTemplate_vercode", context);
        // 发送模板邮件
        sendEmailService.sendTemplateEmail(to,subject,emailContent);
        return code;
    }

    // 用户登录判断
    @PostMapping("/login")
    public User login(@RequestBody User user){
        System.out.println("登录的用户：" + user);
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("mail",user.getMail());
        User userData = userService.getOne(userQueryWrapper);
        // 该用户不存在，返回null
        if (userData == null ) return null;
        System.out.println("数据库中该用户的信息：" + userData);
        if(user.getPassword().equals(userData.getPassword())) return userData;
        // 用户邮箱和密码不匹配，返回用户输入的user(只有他输入的数据，没有id)
        return user;
    }

    // 通过id查询用户信息
    @RequestMapping("/findUserById/{id}")
    public User findUserById(@PathVariable Integer id){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",id);
        return userService.getOne(queryWrapper);
    }

    // 通过id修改用户信息
    @RequestMapping("/updateUserById/{column}/{value}/{id}")
    public R updateUserById(@PathVariable String column,@PathVariable String value,@PathVariable Integer id){
        // 查询得到该用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",id);
        User user = userService.getOne(queryWrapper);
        if (column.equals("mail") ) user.setMail(value);
        if (column.equals("name") ) user.setUsername(value);
        if (column.equals("sex")) user.setSex(value);
        if (column.equals("description")) user.setDescription(value);
        System.out.println("用户修改信息：" + user);
        // 修改该用户信息
        return R.ok().data("update",userService.update(user,queryWrapper)).data("user",user);
    }

    // 通过邮箱更改用户密码
    @RequestMapping("/updatePasswordByMail")
    public boolean updatePasswordByMail(@RequestBody User user){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("mail",user.getMail());
        // 找到该用户
        User user_origin = userService.getOne(queryWrapper);
        if(user_origin==null) {
            return false;
        }
        // 更改该用户密码
        user_origin.setPassword(user.getPassword());
        return userService.update(user_origin,queryWrapper);
    }

    // 上传用户头像
    @RequestMapping("/uploadHeader/{userId}")
    public boolean handleFormUpload( @RequestParam(value="file") List<MultipartFile> uploadfile,
                                     @PathVariable Integer userId,
                                     HttpServletRequest request) {
        // 判断上传的文件是否存在
        if(!uploadfile.isEmpty() && uploadfile.size()>0) {
            // 数据库获取用户
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("id",userId);
            User user = userService.getOne(queryWrapper);
            // 存储后缀变量
            String suffix = new String();
            for (MultipartFile file : uploadfile) {
                // 设置文件的保存目录地址 img/用户id/header.后缀
                String dirPath = request.getServletContext().getRealPath("/img/" + userId + "/");
                File filePath = new File(dirPath);
                // 若保存文件的地址不存在，则创建目录
                if(!filePath.exists()) {
                    filePath.mkdirs();
                }
                // 获取上传文件的后缀
                String fileName = file.getOriginalFilename();
                suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
                if(StringUtils.isEmpty(suffix)){
                    throw new RuntimeException("文件类型错误");
                }
                // 定义上传的头像文件名为：header.后缀
                String newFilename =  "header." + suffix;
                // 使用MultipartFile接口的方法完成文件上传到指定位置
                try {
                    file.transferTo(new File(dirPath + "\\" +  newFilename));
                    // 上传头像成功后，判断该用户曾经是否有头像，数据是否有后缀字段的值
                    if(user.getHeadSuffix()!=null){
                        // 判断新文件的后缀和旧文件的后缀是否相同，若不同，就删掉旧头像文件
                        if (!user.getHeadSuffix().equals(suffix)) {
                            // 删除旧头像文件
                            String[] oldHead= {"header."+user.getHeadSuffix()};
                            delete(oldHead,dirPath);
                            System.out.println("旧头像删除成功！");
                        }
                    }
                    // System.out.println("上传文件所在位置:"+dirPath+"上传文件的文件名:"+newFilename);
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }
            // 头像上传成功，向数据库中存入/更新头像后缀
            user.setHeadSuffix(suffix);
            userService.update(user,queryWrapper);
            return true;
        }else {
             return false;
        }
    }
    // 从Tomcat服务器删除文件
    public boolean delete(String[] pathArr,String dir) {
        int len = pathArr.length;
        int count = 0;
        for (String path : pathArr) {
            //拼接文件完整路径
            String abpath = dir+ File.separator + path;
            //获取需要删除的文件
            File deleteFile = new File(abpath);
            if (deleteFile.exists() && deleteFile.isFile() && deleteFile.delete() == true) {
                count++;
            }
        }
        return count==len ? true:false;
    }

    // 读取用户头像
    @GetMapping("/header/{userId}")
    public void getHeader(@PathVariable Integer userId, HttpServletResponse response, HttpServletRequest request) {
        // 数据库查找用户信息，得到头像的后缀
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",userId);
        User user = userService.getOne(queryWrapper);
        // 拼接后缀得到文件名
        String fileName = "header." + user.getHeadSuffix();
        // 得到到服务器存放路径
        fileName = request.getServletContext().getRealPath("/img/" + userId + "/" + fileName);
        //解析文件后缀
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        //响应的格式
        response.setContentType("image/" + suffix);
        try (FileInputStream stream = new FileInputStream(fileName);
             ServletOutputStream os = response.getOutputStream();) {
            byte[] buffer = new byte[1024];
            int b = 0;
            while ((b = stream.read(buffer)) != -1) {
                os.write(buffer, 0, b);
            }
        } catch (IOException e) {
            System.out.println("读取头像失败");
        }
    }

}
